
/*
 * Copyright 2011 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */
#include "SampleCode.h"
#include "SkCanvas.h"
#include "SkPaint.h"
#include "SkView.h"

///////////////////////////////////////////////////////////////////////////////

class LayerMaskView : public SampleView
    {
    public:
        LayerMaskView()
            {
            this->setBGColor(0xFFDDDDDD);
            }

    protected:
        // overrides from SkEventSink
        virtual bool onQuery(SkEvent* evt)
            {
            if (SampleCode::TitleQ(*evt))
                {
                SampleCode::TitleR(evt, "LayerMask");
                return true;
                }
            return this->INHERITED::onQuery(evt);
            }

        void drawMask(SkCanvas* canvas, const SkRect& r)
            {
            SkPaint paint;
            paint.setAntiAlias(true);

            if (true)
                {
                SkBitmap mask;
                int w = SkScalarRound(r.width());
                int h = SkScalarRound(r.height());
                mask.setConfig(SkBitmap::kARGB_8888_Config, w, h);
                mask.allocPixels();
                mask.eraseColor(0);
                SkCanvas c(mask);
                SkRect bounds = r;
                bounds.offset(-bounds.fLeft, -bounds.fTop);
                c.drawOval(bounds, paint);

                paint.setXfermodeMode(SkXfermode::kDstIn_Mode);
                canvas->drawBitmap(mask, r.fLeft, r.fTop, &paint);
                }
            else
                {
                SkPath p;
                p.addOval(r);
                p.setFillType(SkPath::kInverseWinding_FillType);
                paint.setXfermodeMode(SkXfermode::kDstOut_Mode);
                canvas->drawPath(p, paint);
                }
            }

        virtual void onDrawContent(SkCanvas* canvas)
            {
            SkRect  r;
            r.set(SkIntToScalar(20), SkIntToScalar(20), SkIntToScalar(120), SkIntToScalar(120));
            canvas->saveLayer(&r, NULL, SkCanvas::kARGB_ClipLayer_SaveFlag);
            canvas->drawColor(SK_ColorRED);
            drawMask(canvas, r);
            canvas->restore();
            }

    private:
        typedef SampleView INHERITED;
    };

///////////////////////////////////////////////////////////////////////////////

static SkView* MyFactory()
    {
    return new LayerMaskView;
    }
static SkViewRegister reg(MyFactory);

